package cn.stylefeng.guns.sys.modular.system.mapper;

import cn.stylefeng.guns.base.pojo.page.LayuiPageInfo;
import cn.stylefeng.guns.sys.modular.system.entity.AttendAuditBtyArchives;
import cn.stylefeng.guns.sys.modular.system.entity.AttendAuditBtyArea;
import cn.stylefeng.guns.sys.modular.system.entity.AttendEmployeeMonth;
import cn.stylefeng.guns.sys.modular.system.model.params.AttendAuditDdSupervisorParam;
import cn.stylefeng.guns.sys.modular.system.model.params.AttendAuditManagerSetParam;
import cn.stylefeng.guns.sys.modular.system.model.params.AttendEmployeeMonthParam;
import cn.stylefeng.guns.sys.modular.system.model.result.AttendAuditManagerSetResult;
import cn.stylefeng.guns.sys.modular.system.model.result.AttendEmployeeMonthResult;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 出勤_月度员工档案信息表 Mapper 接口
 * </p>
 *
 * @author wjk
 * @since 2021-09-14
 */
public interface AttendEmployeeMonthMapper extends BaseMapper<AttendEmployeeMonth> {

    /**
     * 获取列表
     *
     * @author wjk
     * @Date 2021-09-14
     */
    List<AttendEmployeeMonthResult> customList(@Param("paramCondition") AttendEmployeeMonthParam paramCondition);

    /**
     * 获取map列表
     *
     * @author wjk
     * @Date 2021-09-14
     */
    List<Map<String, Object>> customMapList(@Param("paramCondition") AttendEmployeeMonthParam paramCondition);

    /**
     * 获取分页实体列表
     *
     * @author wjk
     * @Date 2021-09-14
     */
    Page<AttendEmployeeMonthResult> customPageList(@Param("page") Page page, @Param("paramCondition") AttendEmployeeMonthParam paramCondition);

    /**
     * 获取分页map列表
     *
     * @author wjk
     * @Date 2021-09-14
     */
    Page<Map<String, Object>> customPageMapList(@Param("page") Page page, @Param("paramCondition") AttendEmployeeMonthParam paramCondition);


    /**
     * 增加( 批量插入)
     * @author wjk
     * @Date 2021-09-15
     */
    int addList(List<AttendEmployeeMonth> list);
    /**
     * （店长考勤修改页面）根据店长的手机号码，返回该店的店长，所有的审核信息；
     * @author wjk
     * @Date 2021-09-17
     */
    List<AttendAuditManagerSetResult> getEmployeeListMonthByManagerSetParam(AttendAuditManagerSetParam param);

    /**
     * （督导审核页面）根据督导的手机号码，返回该店的督导所有的审核信息；
     * @author wjk
     * @Date 2021-09-18
     */
    List<AttendAuditManagerSetResult> getEmployeeListMonthByDdSupervisorParam(AttendAuditDdSupervisorParam param);
    /**
     *
     *  将店长提交状态或者督导驳回的新员工状态，更新到督导审核通过状态
     * @author wjk
     * @Date 2021-09-18
     */
    int newEmployeeApprove(List<Long> idlist);
    /**
     *
     *  将店长提交状态,更新到督导审核驳回状态
     * @author wjk
     * @Date 2021-09-18
     */
    int newEmployeeBack(List<Long> idlist);

    /**
     * （督导审核页面）根据督导选择店，月份，返回计算的（待审核，加上已审核通过的人员的应发工资总数）；
     * @author wjk
     * @Date 2021-09-18
     */
    List<Map<String,String>> getShouldPayByDdSupervisor(AttendAuditDdSupervisorParam param);

    /**
     * （督导审核页面）根据大店长选择店，月份，返回计算的（待审核，加上已审核通过的人员的应发工资总数）；
     * @author wjk
     * @Date 2021-10-19
     */
    List<Map<String,String>> getShouldPayByDdzSupervisor(AttendAuditDdSupervisorParam param);

    /**
     * （运营经理页面）根据运营经理选择店，月份，返回计算的（待审核，加上已审核通过的人员的应发工资总数）；
     * @author wjk
     * @Date 2021-10-19
     */
    List<Map<String,String>> getShouldPayByYyjlSupervisor(AttendAuditDdSupervisorParam param);


    /**
     * （店长考勤页面）根据店名，月份，返回计算的（待审核，加上已审核通过的人员的应发工资总数，和人员总数）；
     * @author wjk
     * @Date 2021-09-22
     */
    List<Map<String,String>> getShouldPayByDzInfo(AttendAuditDdSupervisorParam param);
    /**
     * 根据列表查询这些员工已经做过本月考勤记录列表
     * @author wjk
     * @Date 2021-09-23
     */
    List<AttendEmployeeMonth> getEmployeeListByAuditBtyArchiveList( @Param("attendEmployeeMonthList") List<AttendEmployeeMonth>  attendEmployeeMonthList,@Param("attendMonth") String attendMonth);

    int  insertForRq(AttendEmployeeMonth entity);
    /**
     * （督导审核页面）根据督导的手机号码，和考核的月份返回该店的督导所有的店名；
     * @author wjk
     * @Date 2021-10-08
     */
    String[] getShopListByDdSupervisor(AttendAuditDdSupervisorParam param);

    /**
     * （督导审核页面）根据督导的手机号码，和考核的月份返回该店的督导所有的店名；
     * @author wjk
     * @Date 2021-10-14
     */
    List<Map<String,String>> getShopListByDdSupervisorList(AttendAuditDdSupervisorParam param);
    /**
     * 修改若有新员工，则更改新员工状态,为提交状态
     *
     * @param aaId
     * @Date 2021-10-09
     * @return
     */
    int newEmployeeSubmitAudit(@Param("aaId") String aaId);

    /**
     * 若考勤天数，公休天数，还有应发工资为负数，则清空相关数据
     * @param attendEmployeeMonth
     * @return
     */
    int updateDayById(AttendEmployeeMonth attendEmployeeMonth);

    /**
     * 根据督导的手机号，和提交月份或者考勤月份，还有店铺名称，获取该店的考勤信息数据
     * @param param
     * @return
     */
    Map<String,String> getShouldPayPersonSumByDdSupervisor(AttendAuditDdSupervisorParam param);

    /**
     * 根据大店长的手机号，和提交月份或者考勤月份，还有大店长名称，获取该店的考勤信息数据
     * @param param
     * @return
     */
    Map<String,String> getShouldPayPersonSumByDdzSupervisor(AttendAuditDdSupervisorParam param);

    /**
     * 计算店长，所有的本月的员工数
     * @param param
     * @return
     */
    Map<String,String> getEmployeeNumByDzInfo(AttendAuditDdSupervisorParam param);
    /**
     * （督导审核页面）根据大店长的手机号码，返回大店长所有的审核信息；
     * @author wjk
     * @Date 2021-09-18
     */
    List<AttendAuditManagerSetResult> getEmployeeListMonthByDdzSupervisorParam(AttendAuditDdSupervisorParam param);
    /**
     * （督导审核页面）根据大店长的手机号码，和考核的月份返回该店的大店长所有的店名；
     * @author wjk
     * @Date 2021-10-18
     */
    List<Map<String,String>> getShopListByDdzSupervisorList(AttendAuditDdSupervisorParam param);
    /**
     * （运营经理页面）根据运营经理页面的手机号码，和考核的月份返回该店的大店长所有的店名；
     * @author wjk
     * @Date 2021-10-18
     */

    List<Map<String,String>> getShopListByDdzByYyjl(AttendAuditDdSupervisorParam param);

    /**
     * （运营经理页面）根据运营经理页面的手机号码，和考核的月份返回该店的大店长所有的店名；
     *
     * @author wjk
     * @Date 2021-11-19
     */
    Page<Map<String, Object>> getShopListByDdzByYyjlLayuiPage(@Param("page") Page page, @Param("paramCondition") AttendAuditDdSupervisorParam param);

    /**
     * （运营经理页面）根据运营经理的手机号码，和考核的月份返回该店的大店长所有的店名；
     * @author wjk
     * @Date 2021-10-19
     */
    Map<String,String> getShouldPayPersonSumByYyjlSupervisor(AttendAuditDdSupervisorParam param);

    /**
     * 根据运营经理的手机号，和提交月份或者考勤月份，还有运营经理名称，获取该店的考勤信息数据
     * @param param
     * @return
     */
    List<AttendAuditManagerSetResult> getEmployeeListMonthByYyjlSupervisorParam(AttendAuditDdSupervisorParam param);

    /**
     * （运营经理审核页面）根据运营经理的手机号码，返回该店的督导所有的审核信息-分页；
     * @author wjk
     * @Date 2021-11-19
     */
    IPage<AttendAuditManagerSetResult> getEmployeeListMonthByYyjlSupervisorParamLayuiPage(@Param("page") Page page, @Param("paramCondition") AttendAuditDdSupervisorParam param);

    /**
     *  根据店长手机号，和考勤数据，删除这家店这个月的员工考勤信息，
     * @param param
     * @return
     */
    int deleteAttendEmployeeMothByAccount(AttendAuditDdSupervisorParam param);

    /**
     * 查询到这个店，所有本店员工，未进行过调店到其他店的员工和调店到本店的员工信息！
     * @param param
     * @return
     */
    List<AttendEmployeeMonth> getEmployeeListMonthOnlyInShopByDzAccount(AttendAuditDdSupervisorParam param);

    /**
     *  更新到这个店，所有本店员工，未进行过调店到其他店的员工和调店到本店的员工信息！
     * @param attendEmployeeMonthList
     * @param attendMonth
     * @return
     */
    int updateAttendEmployeeMothOnlyInShopByDzAccount(@Param("attendEmployeeMonthList") List<AttendEmployeeMonth> attendEmployeeMonthList,@Param("attendMonth") String attendMonth);

    /**
     * 查询到本店人资表内新增的员工（未被调店到其他店，并且未在现有表id数据中的数据）
     * @param param
     * @return
     */
    List<AttendEmployeeMonth> getEmployeeListMonthNewInShopByDzAccount(AttendAuditDdSupervisorParam param);

    /**
     *  获取到这些员工中，gw和gz 为零的情况，则进行排除员工信息同步
     * @param attendEmployeeMonthList
     * @param attendMonth
     * @return
     */
    List<AttendAuditBtyArchives> getBtyArchivesListNewEmployee(@Param("attendEmployeeMonthList") List<AttendEmployeeMonth> attendEmployeeMonthList, String attendMonth);

    /**
     * 更新到这个店，所有人资表中新员工除去gz,gw 为零的情况
     * @param attendAuditBtyArchivesListBtyArchives
     * @param attendMonth
     * @return
     */
    int updateAttendEmployeeMothOnlyInShopByDzAccountWithOutGzGw(@Param("attendAuditBtyArchivesListBtyArchives") List<AttendAuditBtyArchives> attendAuditBtyArchivesListBtyArchives,@Param("attendMonth") String attendMonth);

    /**
     * （判断考勤天数和公休天数是否为null或者0，判断考勤工资是否为null和0），如果其中一个值未空则，进行清空当条记录的应发工资数据
     * @param listNew
     * @return
     */
    int batchUpdateShouldPayByAttendAuditManagerSetResult(@Param("listNew") List<AttendAuditManagerSetResult> listNew);

    /**
     *  编辑工资应发工资根据
     * @param attendEmployeeMonth
     * @return
     */
    boolean updateByAttendEmployeeMonthId(AttendEmployeeMonth attendEmployeeMonth);


    /**
     * （店长考勤修改页面）添加新员工验证，根据员工信息
     * @date 2021-11-08
     */
    List<AttendAuditManagerSetResult> getEmployeeListMonthByEmployeeInfo(AttendAuditManagerSetResult attendAuditManagerSetResult);

    /**
     * （店长考勤修改页面）若上面考勤信息中，和档案中没有，则查找钉钉中的数据，若有,则返回从钉钉查找到的数据
     * @date 2021-11-08
     */
    List<AttendAuditManagerSetResult> getAttendEmployeeMonthSysEmp(AttendAuditManagerSetResult attendAuditManagerSetResult);

    /**
     *  需要根据编号从钉钉数据中获取到数据
     * @param attendEmployeeMonthOld
     * @return
     */
    List<AttendEmployeeMonth> getAttendEmployeeMonthSysEmpByBh(AttendEmployeeMonth attendEmployeeMonthOld);

    /**
     *  更新，xm,zw,sjh,sfz,yhk,gz,gw,根据id,
     *  updateAttendEmployeeMonthNewRecord
     *  @param newRecord
     */
    int updateAttendEmployeeMonthNewRecord(AttendAuditManagerSetResult newRecord);

    /******************************************   同步回人资表数据 start ******************************************************************/
    /*
     *
     */
    int bakbtyArchives(@Param("tableName") String tableName);

    /**
     *  查找出已经审核通过的数据，统计数量
     * @param param
     * @return
     */
    List<AttendEmployeeMonth> auditStatusForSuccessEmployee(AttendAuditDdSupervisorParam param);

    /**
     * 查找出已经审核通过的店,统计数量
     * @param param
     * @return
     */
    List<AttendAuditBtyArea> auditStatusForSuccessShopName(AttendAuditDdSupervisorParam param);

    /**
     *  同步所有人资表中的数据
     * @param param
     * @return
     */
    int auditStatusForSuccess(AttendAuditDdSupervisorParam param);


    /**
     * 将人员状态修改为已同步
     * @param param
     * @return
     */
    int auditStatusForSuccessNewEmp(AttendAuditDdSupervisorParam param);



    /******************************************   同步回人资表数据 end ******************************************************************/











    /**
     * 查询银行卡在本月考勤，是否有重复数据，若有重复数据， 取出重复数据的人员信息(非此员工)，
     * @param attendEmployeeMonthParam
     * @param attendMonth
     * @return
     * @author wjk
     * @Date 2021-12-17
     */
    List<AttendEmployeeMonth> getListByYhk(@Param("paramCondition") AttendEmployeeMonthParam attendEmployeeMonthParam,@Param("attendMonth") String attendMonth);










    /**
     * 员工姓名不一致，则只根据员工的id 修改员工的姓名，与档案数据一致
     * @param attendEmployeeMonthParam
     * @return
     */
    boolean updateAttendEmployeeMonthNameById(@Param("paramCondition")AttendEmployeeMonth attendEmployeeMonthParam);
}
